visitees
dans laquelle on mémorise les cellules déjà visitées
visitees
. On initialisera a_visiter
avec toutes les cellules sauf celle de départ. Comment faire pour choisitr la plus ancienne cellule dévoilée dans a_visiter
?
a_visiter
. Il n'y plus besoin d'ajouter les voisins à chaque étape.
predC
sont non définies car aucun parcoursLabyrinthe
créée précédemment. Au besoin, vous pouvez télécharger cette version.
a_visiter
, tableau des distances
parcourues et tableau des predecesseurs
.voisins()
MAJ_distances()
choix_cellule()
dijkstra()
width
colonnes par height
lignes.
Labyrinthe.init_dijkstra(i0,j0)
qui prend en arguments i0
et j0
les coordonnées de la cellule de départ et qui crée les attributs suivants (qui sont tous des ) :
Labyrinthe.a_visiter
une liste de couples de coordonnées[[i1,j1],..., [ik,jk]]
restant à visiter lors du parcours.Initialement, toutes les cellules du labyrinthe sont à visiter.Labyrinthe.distances
un tableau de height
lignes par height
colonnes. Chaque élément du tableau de coordonnée (i,j) est un entier indiquant le nombre déplacements entre la cellule (i,j) et la cellule de départ. La valeur initiale est ∞ (car les cellules ne sont pas atteintes).float("inf")
distances
est des tableaux à height
lignes et height
colonnesa_visiter
est une liste (vide au début) qui contient des couples (i,j)
de coordonnées de cellulesself.print(valeurs)
. Il faut modifier la méthode afin de lui permettre d'afficher les distances
. On peut recopier la méthode ci-dessous ou la télécharger.
init_dijkstra()
fonctionne correctement en affichant les attributs self.distances
:
>>>laby.print(laby.cellules_visitees)
┌──────┬─────────────┐
│ inf │ inf inf │
│ ╵ ╶──────┤
│ inf inf inf │
├──────╴ ╶──────┤
│ inf inf inf │
└────────────────────┘
Labyrinthe.voisins(i,j)
qui prend en arguments i
et j
les coordonnées d'une cellule et qui renvoie une liste de couples de coordonnées[(i1,j1),..., (ik,jk)]
de voisins directs (4 maximum) :
N,E,S,W
de la cellule de coordonnées (i,j)
pour connaître ses voisinsfor k in D:
pour parcourir les clé d'un dictionnaire D
Labyrinthe.MAJ_distances(i1,j1)
qui prend en arguments i1
et j1
les coordonnées d'une cellule à une étape de l'algorithme et qui pour chaque cellule voisine i,j
affecte à sa distance celle du prédécesseur i1,j1
augmentée de 1 à la condition que cette nouvelle distance améliore l'ancienne (plus courte).
(i2,j2)
de (i1,j1)
et actualiser distances[i2][j2]
si besoinL
de couples (i,j)
, on peut utiliser for (i,j) in L:
Labyrinthe.choix_chemin()
qui recherche dans les cellules de l'attribut Labyrinthe.a_visiter
celle qui a la distance calculée la plus petite (afin de la sélectionner dans l'algorithme de parcours).
(i,j)
de a_visiter
pour trouver la plus petite distances[i][j]
dmin
(plus petite distance) et (imin,jmin)
la cellule correspondante.dmin
est très très grande, et imin
et jmin
indéfinisLabyrinthe.dijkstra(i0,j0)
qui prend en arguments i0
et j0
la cellule de départ et qui parcourt le labyrinthe en largeur pour trouver les distances minimales de chaque cellule à celle de départ.
a_visiter
n'est pas videdmin
est très très grande, et imin
et jmin
indéfinisLabyrinthe.print()
, en affichant les distances, que le parcours se déroule correctement :
┌─────┬───────────┬───────────┐
│ 0 │ 13 12 │ 15 14 │
│ ├─────┐ └─────╴ │
│ 1 │ 4 │ 11 12 13 │
│ ╵ │ ╶─────┐ │
│ 2 3 │ 10 9 │ 14 │
│ ┌─────┘ ╷ └─────┤
│ 3 │ 12 11 │ 8 9 │
│ └───────────┘ ╶─────┤
│ 4 5 6 7 8 │
└─────────────────────────────┘
i0,j0
et une arrivée iN,jN
, on souhaite afficher le chemin le plus court les reliant :
Labyrinthe.court_chemin(i0,j0,iN,jN)
qui prend en arguments i0, j0
la cellule de départ et iN, jN
et renvoie le plus court chemin dans le parcours de dijkstra()
, c'est à dire la liste des cellules composant ce chemin.
Labyrinthe.print_chemin(i0,j0,iN,jN)
qui affiche dans la console le plus court chemin entre les cellules données en argument de la manière suivante :
┌────┬────┬──────────────┬────┬────┬────┬────┬────┬─────────┬──────────────┐
│ * │ │ │ │ │ │ │ │ │ │
│ ╵ └────╴ ╷ │ ╵ │ │ │ ╵ ╶────┤ ╶────┐ │
│ * * │ │ │ │ │ │ │ │
│ ╷ ╶────┐ └────┘ ┌────┤ ╵ │ ╷ ╶────┴────╴ │ │
│ │ * * │ │ │ │ │ │ │
├────┼────╴ │ ╷ ┌────┘ ╵ ╷ └────┤ ╷ ┌─────────┴────┤
│ │ * │ │ │ │ * * │ │ │ │
│ │ ╷ └────┴────┼────╴ ┌────┘ ╷ ╵ ├────┘ ╷ ╶────┤
│ │ │ * │ │ * │ * * │ │ │
│ ╵ │ ╷ ╷ └────┬────┼────╴ └────┐ ╵ ╶────┤ ╶────┤
│ │ * │ │ │ │ * * │ * * * │ │
│ ╶────┤ └────┼────┐ │ │ ╶─────────┼─────────╴ │ ╶────┤
│ │ * │ │ │ │ * │ * │ │
├────╴ │ ╶────┘ │ │ ╵ ╶────┬────┴────┬────╴ ├────┐ │
│ │ * * * │ │ * * │ │ * │ │ │
├────╴ └────┬────╴ └────┘ ┌────┬────┼────╴ └────╴ ╵ │ │
│ │ * * * │ │ │ * * │ │
├────┬────╴ │ ┌────┐ ┌────┘ ╵ ├────╴ ┌─────────╴ └────┤
│ │ │ │ │ │ │ │ * │
│ │ ╷ │ ╵ │ ╵ ╶────┐ │ ┌────┘ ┌────┐ ┌────┤
│ │ │ │ │ │ │ │ │ │ * │ │
│ │ └────┼─────────┼─────────╴ ├────┴────┘ ┌────┤ │ ╵ │
│ │ │ │ │ │ │ │ * │
│ └─────────┴────┐ └────┐ ╶────┼────┐ ╷ ╵ ╵ │ ╶────┤
│ │ │ │ │ │ │ * * │
│ ╶────┐ ┌────┘ ╶────┘ ╷ │ ╵ └────┬────╴ ├────╴ │
│ │ │ │ │ │ │ * * │
│ ╶────┤ ╵ ╷ ┌────╴ ├────┘ ╷ ╷ └────┐ │ ╶────┤
│ │ │ │ │ │ │ │ │ * * │
└─────────┴─────────┴────┴─────────┴─────────┴────┴─────────┴────┴─────────┘
i,j
à la cellule de départ i0,j0
, il suffit de noter la cellule précedente dans un tableau height
par width
qu'on appelera predecesseurs
. En remontant les prédécesseurs, on arrive toujours à la cellule de départ en parcourant le chemin à l'envers.
predecesseurs
doit être initialisé dans init_dijkstra()
puis mis à jour à chaque itération dans MAJ_distances()
. A l'initialisation, les cellules n'ont aucun prédecesseur, la valeur par défaut pourra être (None, None)
ou (-1,-1)
.
Labyrinthe.ouvrir_murs(pct)
qui prend en argument un pourcentage (nombre entre 0 et 100) et qui ouvre aléatoirement pct %des murs dans le labyrinthe.
┌────────────────────────┐
│ * * │
├────╴ ┌────╴ │
│ * │ │
│ ╷ ╶────┴────╴ │
│ │ * * * │
│ └────┬────┐ ╶────┤
│ │ │ * * │
│ ╷ ╵ └────┐ │
│ │ │ * │
└────┴──────────────┴────┘
height*width
cellules. Pour arrondir un nombre, utiliser la fonction int()
.random.randint(a,b)
print_plot()
afin de tracer graphiquement le chemin le plus court reliant deux cellules.
Labyrinthe.print_plot(chemin)
qui prendra désormais un argument facultatif chemin
(obtenu par court_chemin(i0,j0,i1,j1)
). Permettant d'afficher le chemin, lorsqu'il est précisé, de la manière suivante :
Au besoin, vous pouvez partir de cette archive . Le fichier labyrinthe.js contient les instructions qui mettent en scène un labyrinthe. La fichier labyrinthe.html est à ouvrir dans le navigateur.
cells
d'un labyrinthe généré, ainsi que d'un chemin
solution (liste de coordonnées de cellules), modifier votre fichier labyrinthe.js afin de faire apparaître le chemin solution. Le choix de l'indice visuel est laissé à votre discrétion (pierres au sol, flèche sur le mur, fil suspendu, etc.)